# 工具链配置
CC = arm-none-eabi-gcc
AS = arm-none-eabi-gcc -x assembler-with-cpp
OBJCOPY = arm-none-eabi-objcopy
OBJDUMP = arm-none-eabi-objdump
SIZE = arm-none-eabi-size

# 目标名称和构建目录
TARGET = main
BUILD_DIR = build

# MCU配置
MCU = -mcpu=cortex-m3 -mthumb
DEFS = -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER

# 头文件路径
INC_DIRS = -I. \
           -IUser \
           -ICMSIS/CM3/CoreSupport \
           -ICMSIS/CM3/DeviceSupport \
           -ILibrary/inc \
           -IBSP/include

# 编译选项
CFLAGS = $(MCU) $(DEFS) -O0 -g3 -Wall -fdata-sections -ffunction-sections $(INC_DIRS)
ASFLAGS = $(MCU) $(DEFS) $(INC_DIRS)
LDFLAGS = $(MCU) -TStart/STM32F103C8T6_FLASH.ld \
          -Wl,--gc-sections -specs=nosys.specs -Wl,-Map=$(BUILD_DIR)/$(TARGET).map

# 源文件列表（所有 .c 和 .s 文件）
C_SRCS = $(wildcard User/*.c BSP/source/*.c CMSIS/CM3/DeviceSupport/*.c Library/src/*.c)
ASM_SRCS = $(wildcard Start/*.s)
SRCS = $(C_SRCS) $(ASM_SRCS)

# 中间 .o 文件路径（全部放在 build 目录下，无子目录）
OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(C_SRCS:.c=.o)) $(notdir $(ASM_SRCS:.s=.o)))

# 默认目标：生成所有最终文件 + 自动删除 .o 文件
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin $(BUILD_DIR)/$(TARGET).map $(BUILD_DIR)/$(TARGET).dis
	@echo "Begin  delete  intermediate .o files "
	@echo "..."
	@rm -f $(OBJS) 
	@echo "Success Deleted intermediate .o files"

# 生成 ELF 文件（依赖所有 .o 文件）
$(BUILD_DIR)/$(TARGET).elf: $(OBJS) | $(BUILD_DIR)
	$(CC) $^ $(LDFLAGS) -o $@
	$(SIZE) $@  # 显示 ELF 文件大小信息

# 生成 HEX 文件
$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf
	$(OBJCOPY) -O ihex $< $@

# 生成 BIN 文件
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf
	$(OBJCOPY) -O binary -S $< $@

# 生成反汇编文件（带源代码混合显示）
$(BUILD_DIR)/%.dis: $(BUILD_DIR)/%.elf
	$(OBJDUMP) -S -d $< > $@

# 编译 C 文件：匹配不同目录的 .c 源文件，生成 build/%.o
$(BUILD_DIR)/%.o: User/%.c | $(BUILD_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

$(BUILD_DIR)/%.o: BSP/source/%.c | $(BUILD_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

$(BUILD_DIR)/%.o: CMSIS/CM3/DeviceSupport/%.c | $(BUILD_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

$(BUILD_DIR)/%.o: Library/src/%.c | $(BUILD_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

# 编译汇编文件：匹配 Start 目录的 .s 文件，生成 build/%.o
$(BUILD_DIR)/%.o: Start/%.s | $(BUILD_DIR)
	$(AS) $(ASFLAGS) -c $< -o $@

# 创建 build 目录（确保存在）
$(BUILD_DIR):
	mkdir -p $@

# 清理目标：删除 build 目录所有文件
clean:
	rm -rf $(BUILD_DIR)

.PHONY: all clean


